home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / crt / sun3.md / RCS / Faintd.s,v < prev    next >
Text File  |  1988-06-19  |  6KB  |  250 lines

  1. head     1.1;
  2. access   ;
  3. symbols  ;
  4. locks    ; strict;
  5. comment  @# @;
  6.  
  7.  
  8. 1.1
  9. date     88.06.19.14.35.35;  author ouster;  state Exp;
  10. branches ;
  11. next     ;
  12.  
  13.  
  14. desc
  15. @@
  16.  
  17.  
  18.  
  19. 1.1
  20. log
  21. @Initial revision
  22. @
  23. text
  24. @        .data
  25.         .asciz  "@@(#)Faintd.s 1.1 86/09/24 Copyr 1985 Sun Micro"
  26.         .even
  27.         .text
  28.  
  29. |       Copyright (c) 1985 by Sun Microsystems, Inc.
  30.  
  31. #include "fpcrtInt.h"
  32.  
  33. RTENTRY(Farintd)
  34.     moveml    d2-d4,sp@@-
  35.     movel    d0,d2        | d2 gets top(x).
  36.     bclr    #31,d2        | d2 gets top(abs(x)).
  37.     cmpl    #0x3ff00000,d2
  38.     bges    2f        | Branch if abs(x) >= 1.0.
  39.     andl    #0x80000000,d0    | Isolate sign of x.
  40.     cmpl    #0x3fe00000,d2
  41.     blts    6f        | Branch if abs(x) < 0.5.
  42.     tstl    d1
  43.     beqs    7f        | Branch if abs(x) = 0.5 exactly.
  44.     orl    #0x3ff00000,d0    | Make signed 1.0.
  45. 6:
  46.     clrl    d1        | Clear lower part in any case.
  47. 7:
  48.     jra    Farintddone
  49. 2:
  50.     cmpl    #0x43300000,d2
  51.     blts    3f        | Branch if 1 <= |x| < 2**52.
  52. Farintdbig:
  53.     cmpl    #0x7ff00000,d2
  54.     blts    Farintddone    | Branch if x is finite.
  55.     bgts    1f        | Branch if x is nan.
  56.     tstl    d1
  57.     beqs    Farintddone    | Branch if x is infinity.
  58. 1:
  59.     bset    #19,d0        | Convert quiet to signalling.
  60.     bras    Farintddone
  61. 3:
  62.     roll    #8,d2
  63.     roll    #4,d2
  64.     andw    #0xfff,d2    | d2 gets biased exponent.
  65.     cmpw    #0x3ff+20,d2
  66.     bges    4f        | Branch if exp >= 20.
  67.     subw    #0x3ff+19,d2    | d2 gets unbiased exponent - 19.
  68.     negw    d2        | d2 gets 19-exp = bit number.
  69.     clrl    d3
  70.     bset    d2,d3        | Set round bit.
  71.     addl    d3,d0        | Add round bit.
  72.     lsll    #1,d3        | Make 2**0 bit.
  73.     subql    #1,d3        | Fraction bit mask.
  74.     tstl    d1
  75.     bnes    2f        | Branch if not ambiguous case.
  76.     movel    d0,d4
  77.     andl    d3,d4        | d4 gets rounded fraction field.
  78.     bnes    2f        | Branch if not ambiguous case.
  79.     addqw    #1,d2        | Make bit number for 2**0.
  80.     bclr    d2,d0        | Force round to even.
  81. 2:
  82.     notl    d3
  83.     andl    d3,d0        | Clear fraction field.
  84. 1:
  85.     clrl    d1        | Lower half is all fraction bits.
  86.     bras    Farintddone
  87. 4:
  88.     bnes    7f        | Branch if exponent > 20.
  89.     addl    #0x80000000,d1  | Add round bit.
  90.     bccs    8f        | Branch if no carry out.
  91.     addql    #1,d0        | Propagate carry.
  92. 8:
  93.     tstl    d1
  94.     bnes    1b        | Branch if not ambiguous.
  95.     bclr    #0,d0        | Force round to even.
  96.     bras    Farintddone
  97. 7:
  98.     subw    #0x3ff+51,d2    | d2 gets exp-51.
  99.     negw    d2        | d2 gets bit number 51-exp.
  100.     clrl    d3
  101.     bset    d2,d3        | Set round bit.
  102.     addl    d3,d1        | Add round.
  103.     bccs    9f
  104.     addql    #1,d0        | Propagate carry.
  105. 9:
  106.     movel    d3,d4
  107.     subql    #1,d4
  108.     orl    d4,d3        | d3 gets fraction bit mask.
  109.     movel    d3,d4
  110.     andl    d1,d4
  111.     bnes    1f        | Branch if not ambiguous.
  112.     addqw    #1,d2
  113.     bclr    d2,d1        | Force round to even.
  114. 1:
  115.     notl    d3
  116.     andl    d3,d1        | Clear fraction bits.
  117. Farintddone:
  118.     moveml    sp@@+,d2-d4
  119.     RET
  120.  
  121. RTENTRY(Fanintd)
  122.     moveml    d2-d4,sp@@-
  123.     movel    d0,d2        | d2 gets top(x).
  124.     bclr    #31,d2        | d2 gets top(abs(x)).
  125.     cmpl    #0x3ff00000,d2
  126.     bges    2f        | Branch if abs(x) >= 1.0.
  127.     andl    #0x80000000,d0    | Isolate sign of x.
  128.     cmpl    #0x3fe00000,d2
  129.     blts    6f        | Branch if abs(x) < 0.5.
  130.     orl    #0x3ff00000,d0    | Make signed 1.0.
  131. 6:
  132.     clrl    d1        | Clear lower part in any case.
  133.     jra    Farintddone
  134. 2:
  135.     cmpl    #0x43300000,d2
  136.     jge    Farintdbig    | Branch if not 1 <= |x| < 2**52.
  137.     roll    #8,d2
  138.     roll    #4,d2
  139.     andw    #0xfff,d2    | d2 gets biased exponent.
  140.     cmpw    #0x3ff+20,d2
  141.     bges    4f        | Branch if exp >= 20.
  142.     subw    #0x3ff+19,d2    | d2 gets unbiased exponent - 19.
  143.     negw    d2        | d2 gets 19-exp = bit number.
  144.     clrl    d3
  145.     bset    d2,d3        | Set round bit.
  146.     addl    d3,d0        | Add round bit.
  147.     lsll    #1,d3        | Make 2**0 bit.
  148.     subql    #1,d3        | Fraction bit mask.
  149.     notl    d3
  150.     andl    d3,d0        | Clear fraction field.
  151. 1:
  152.     clrl    d1        | Lower half is all fraction bits.
  153.     bras    Farintddone
  154. 4:
  155.     bnes    7f        | Branch if exponent > 20.
  156.     addl    #0x80000000,d1  | Add round bit.
  157.     bccs    1b        | Branch if no carry out.
  158.     addql    #1,d0        | Propagate carry.
  159.     bras    1b
  160. 7:
  161.     subw    #0x3ff+51,d2    | d2 gets exp-51.
  162.     negw    d2        | d2 gets bit number 51-exp.
  163.     clrl    d3
  164.     bset    d2,d3        | Set round bit.
  165.     addl    d3,d1        | Add round.
  166.     bccs    9f
  167.     addql    #1,d0        | Propagate carry.
  168. 9:
  169.     lsll    #1,d3
  170.     subql    #1,d3
  171.     notl    d3
  172.     andl    d3,d1        | Clear fraction bits.
  173.     jra    Farintddone
  174.  
  175. RTENTRY(Faintd)
  176.     moveml    d2-d4,sp@@-
  177.     movel    d0,d2        | d2 gets top(x).
  178.     bclr    #31,d2        | d2 gets top(abs(x)).
  179.     cmpl    #0x3ff00000,d2
  180.     bges    2f        | Branch if abs(x) >= 1.0.
  181.     andl    #0x80000000,d0    | Isolate sign of x.
  182.     clrl    d1        | Clear lower part in any case.
  183.     jra    Farintddone
  184. 2:
  185.     cmpl    #0x43300000,d2
  186.     jge    Farintdbig    | Branch if not 1 <= |x| < 2**52.
  187.     roll    #8,d2
  188.     roll    #4,d2
  189.     andw    #0xfff,d2    | d2 gets biased exponent.
  190.     cmpw    #0x3ff+20,d2
  191.     bges    4f        | Branch if exp >= 20.
  192.     subw    #0x3ff+20,d2    | d2 gets unbiased exponent - 20.
  193.     negw    d2        | d2 gets 20-exp = bit number.
  194.     clrl    d3
  195.     bset    d2,d3        | Set round bit.
  196.     subql    #1,d3        | Fraction bit mask.
  197.     notl    d3
  198.     andl    d3,d0        | Clear fraction field.
  199. 1:
  200.     clrl    d1        | Lower half is all fraction bits.
  201.     jra    Farintddone
  202. 4:
  203.     beqs    1b        | Branch if exponent not > 20.
  204. 7:
  205.     subw    #0x3ff+52,d2    | d2 gets exp-52.
  206.     negw    d2        | d2 gets bit number 52-exp.
  207.     clrl    d3
  208.     bset    d2,d3        | Set round bit.
  209.     subql    #1,d3
  210.     notl    d3
  211.     andl    d3,d1        | Clear fraction bits.
  212.     jra    Farintddone
  213.  
  214. RTENTRY(Ffloord)
  215.     moveml    d0-d3,sp@@-    | Save x and d2/d3.
  216.     jbsr    Faintd        | d0 gets aint(x).
  217.     moveml    sp@@+,d2-d3    | d2/d3 gets x.
  218.     tstl    d2
  219.     bpls    Ffloorddone    | Branch if x is positive.
  220.     cmpl    d0,d2
  221.     bnes    1f
  222.     cmpl    d1,d3
  223.     beqs    Ffloorddone    | Return x if x = aint(x).
  224. 1:
  225.     lea    one,a0
  226.     jsr    Fsubd        | d0 gets aint(x)-1.
  227. Ffloorddone:
  228.     moveml    sp@@+,d2-d3
  229.     RET
  230.  
  231. one:    .double 0r1.0
  232.  
  233. RTENTRY(Fceild)
  234.     moveml    d0-d3,sp@@-    | Save x and d2/d3.
  235.     jbsr    Faintd        | d0 gets aint(x).
  236.     moveml    sp@@+,d2-d3    | d2/d3 gets x.
  237.     tstl    d2
  238.     bmis    Fceilddone    | Branch if x is negative.
  239.     cmpl    d0,d2
  240.     bnes    1f
  241.     cmpl    d1,d3
  242.     beqs    Fceilddone    | Return x if x = aint(x).
  243. 1:
  244.     lea    one,a0
  245.     jsr    Faddd        | d0 gets aint(x)+1.
  246. Fceilddone:
  247.     moveml    sp@@+,d2-d3
  248.     RET
  249. @
  250.